package main

import (
	"fmt"
	"math"
)

// 写一个 ConvertInt64ToInt() 函数把 int64 值转换为 int 值，如果发生错误（提示：参见 4.5.2.1 节）就 panic() 。
// 然后在函数 IntFromInt64 中调用这个函数并 recover()，返回一个整数和一个错误。请测试这个函数！

func ConvertInt64ToInt(i int64) (d int) {
	if i < math.MinInt32 || i > math.MaxInt32 {
		panic(fmt.Sprintf("out of int range"))
	}
	d = int(i)
	return
}

func IntFromInt64(i int64) (d int, err error) {
	defer func() {
		if e := recover(); e != nil {
			var ok bool
			err, ok = e.(error)
			if !ok {
				err = fmt.Errorf("Covert int64 %d error: %v", i, e)
			}
		}
	}()
	d = ConvertInt64ToInt(i)
	return
}

func main() {
	var min int64
	min = math.MinInt32 - 1
	if d, err := IntFromInt64(min); err != nil {
		fmt.Println(err)
	} else {
		fmt.Printf("Convert %d to int %d success\n", min, d)
	}

	i := int64(1987)
	if d, err := IntFromInt64(i); err != nil {
		fmt.Println(err)
	} else {
		fmt.Printf("Convert %d int64 to int %d int success\n", i, d)
	}
}
